<?php

/*
 * Контроллер, который принимает от редактора изображений pixlr.com изображение
 * Конкретно приходят следующие параметры:
 * image - адрес картинки
 * type - тип (jpg, png, bmp or pxd)
 * title - заголовок картинки
 * в дополнение приходят 
 * Id - идентификатор картинки
 * SizeId - размер картинки которая редактировалась
 * token - подпись (разрешение на сохранение) - хеш от строки Id_SizeId + соль 
 * соль определена в конфиге application.ini под именем cryptoSalt
 * 
 */

class Api_PixlrController extends Zend_Controller_Action{

    public function indexAction(){
        $params = $this->_request->getParams();
        $form = new Api_Form_PixlrResponse();
        if (!$form->isValid($params))
            throw new Zend_Exception("The response from pixlr.com is invalid.");
        $params = $form->getValidValues($params);
        
        $u = strtolower($_SERVER["REDIRECT_URL"]);
        $p = strpos($u, '/api/pixlr/index/');
        if ($p===false)
            throw new Zend_Exception("The request has unknownk format. Should start width: /api/pixlr/index/. But starts with: ".$u);
        $u=substr($u, 17);//echo $u;
        $ids = explode('/',$u,4);
        $id = (int) $ids[0];
        $sizeId =(int) $ids[1];
        
        $b = $this->getInvokeArg('bootstrap');
        if (!$b->hasOption('cryptoSalt'))
            throw new Zend_Exception("cryptoSalt wasn't specified in application.ini");
        $salt = $b->getOption('cryptoSalt');
        if ($salt=="")
            throw new Zend_Exception("cryptoSalt is empty");
        $tm1 = time();
        $tm2 = $tm1 - 86400;
        
        if (($ids[2]!=md5($id+$sizeId+$salt+date('dmY',$tm1)))
            &&($ids[2]!=md5($id+$sizeId+$salt+date('dmY',$tm2))))
            throw new Zend_Exception("Invalid securety token");
        
        $mapper = new Admin_Model_GalleryItemMapper();
        $img = $mapper->find($id,$sizeId);
        if (null==$img)
            throw new Zend_Exception("Image with Id=".$id." and SizeId=".$sizeId." was not found");

        $gallery_dir = './pics/gallery/';
        $gallery_tmp_dir = './pics/gallery/tmp/';
        $f = fopen($_GET['image'],'r');
        $name = $gallery_tmp_dir.$ids[2].time().'.tmp';
        $dst = fopen($name,'x');
        while (!feof($f)) {
            $contents = fread($f, 8192);
            fwrite($dst,$contents);
        }
        fclose($dst);
        fclose($f);
        list($width, $height) = getimagesize($name);
        
        $old_file = $img->getFileName();
        //$new_file = $id.'_'.$sizeId.'_'.$width.'x'.$height.'.'.$params['type'];
        $img->setWidth($width)->setHeight($height)->setExt($params['type']);
        try{
            $mapper->save($img);
            @unlink($gallery_dir.$old_file);
            rename($name,$gallery_dir.$id.'_'.$sizeId.'_'.$width.'x'.$height.'.'.$params['type']);
            $this->view->result = true;
            $this->view->image = $img;
        }
        catch(Exception $e)
        {
            unlink($name);
        }
    }
    
    public function getTokenAction(){
        $id = (int) $this->_request->getParam('Id',0);
        $sizeId = (int) $this->_request->getParam('SizeId',0);
        if (($id==0) || ($sizeId==0))
            throw new Zend_Exception("Get params id and sizeId was not specified");
        $b = $this->getInvokeArg('bootstrap');
        if (!$b->hasOption('cryptoSalt'))
            throw new Zend_Exception("cryptoSalt wasn't specified in application.ini");
        $salt = $b->getOption('cryptoSalt');
        if ($salt=="")
            throw new Zend_Exception("cryptoSalt is empty");
        $this->_helper->json(array('token'=>md5($id+$sizeId+$salt+date('dmY'))));
    }
}
?>